﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using TCC_Hotel.Repositorio;
using TCC_Hotel.Serviços;
using TCC_Hotel.Entidades.Basicas;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Funcionarios
{
    public partial class CadastrarFuncionario : System.Web.UI.Page
    {
        WebServices servicos = new WebServices();
        GeralServices geral = null;
        FuncionarioService servico = new FuncionarioService();
       
       /// <summary>
       /// Carregamento da pagina
       /// </summary>     
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Funcionarios)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                geral = new GeralServices();
                //popular o dropdown estados
                ddlEstado.DataSource = geral.GetEstados();
                ddlEstado.DataTextField = "nome";
                ddlEstado.DataValueField = "sigla";
                ddlEstado.DataBind();

                //São Paulo será o estado default
                ddlEstado.SelectedValue = "SP";

                //popular o dropdown cargos
                
                ddlCargo.DataSource = geral.GetCargos();
                ddlCargo.DataBind();
            }
        }

        /// <summary>
        /// Busca por CEP  o endereço correspondente
        /// </summary>
       protected void btnBuscaCEP_Click(object sender, EventArgs e)
        {
           //Chama o serviço que faz essa busca
            Endereco endereco = servicos.GetEnderecoPorCEP(txtCEP.Text);

           //Preenche os textbox com o endereço correspondente
            txtBairro.Text = endereco.Bairro;
            txtLogradouro.Text = endereco.Logradouro;
            txtCidade.Text = endereco.Cidade;

            if (!String.IsNullOrEmpty(endereco.Estado.sigla))
                ddlEstado.SelectedValue = endereco.Estado.sigla;          
        }

        /// <summary>
        /// Tenta salvar o funcionário no banco de dados
        /// </summary>
       protected void btnSalvar_Click(object sender, EventArgs e)
        {
            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios fora preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtNascimento.Text,
                txtLogradouro.Text.Trim(),
                txtBairro.Text.Trim(),
                txtCEP.Text,
                txtCidade.Text.Trim(),
                txtNumero.Text,
                txtCPF.Text,
                txtRG.Text,
                txtAdmissao.Text,
                txtSalario.Text,
                txtCarteiraTrabalho.Text,
                txtPIS.Text,
                txtSenha.Text,
                txtConfirmaSenha.Text,
                txtUsuario.Text
            
            };


            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;                
            }
          

            //faz a validação das datas         
           if (!comum.ValidaData(txtNascimento.Text) || !comum.ValidaData(txtAdmissao.Text))
            {
                 MensagemJS("ERRO: Data(s) inválida(s)");
                 return;
            }

            //Faz validação do CPF
           if (!comum.ValidaCPF(txtCPF.Text))
           {
               MensagemJS("ERRO: CPF digitado não é válido");
               return;
           }

           //Faz validação do RG
           if (!comum.ValidaRG(txtRG.Text))
           {
               MensagemJS("ERRO: RG digitado não é válido!");
               return;
           }

           //Verifica se o RG ja esta cadastrado
           if (!servico.VerificarRGCadastrado(txtRG.Text))
           {
               MensagemJS("ERRO: RG já cadastrado!");
               return;
           }

           //Verifica se o usuario ja esta cadastrado
           if (!servico.VerificarUsuarioCadastrado(txtUsuario.Text))
           {
               MensagemJS("ERRO: Usuário já cadastrado!");
               return;
           }


           //Faz validação do PIS
           if (!servico.ValidaPIS(txtPIS.Text))
           {
               MensagemJS("ERRO: PIS digitado não é válido");
               return;
           }


           //Faz validação dos telefones
           List<string> DDDs = new List<string>();
           List<string> Telefones = new List<string>();

           Telefones.Add(txtCelular1.Text);
           Telefones.Add(txtCelular2.Text);
           Telefones.Add(txtTelefone1.Text);
           Telefones.Add(txtTelefone2.Text); 
          
           DDDs.Add(txtDDDCelular1.Text);
           DDDs.Add(txtDDDCelular2.Text);
           DDDs.Add(txtDDDTelefone1.Text);
           DDDs.Add(txtDDDTelefone2.Text);
               

           if (!comum.ValidaTelefones(DDDs, Telefones))
           {
               MensagemJS("ERRO: Telefones digitados não são válidos");
               return;
           }

           if (txtSenha.Text != txtConfirmaSenha.Text)
           {
               MensagemJS("ERRO: Senhas digitadas não são iguais");
               return;
           }

            //monta o objeto funcionario
           try
           {
               Funcionario funcionario = new Funcionario()
               {
                   Nome = txtNome.Text.Trim(),
                   Nascimento = Convert.ToDateTime(txtNascimento.Text),
                   Contato = new Contato()
                   {

                       Celular = new List<string>() { (txtDDDCelular1.Text + txtCelular1.Text), (txtDDDCelular2.Text + txtCelular2.Text) },
                       Telefone = new List<string>() { (txtDDDTelefone1.Text + txtTelefone1.Text), (txtDDDTelefone2.Text  + txtTelefone2.Text) },
                       Email = txtEmail.Text

                   },
                   Endereco = new Endereco()
                   {
                       Logradouro = txtLogradouro.Text.Trim(),
                       Bairro = txtBairro.Text.Trim(),
                       CEP = txtCEP.Text,
                       Cidade = txtCidade.Text.Trim(),
                       Complemento = txtComplemento.Text.Trim(),
                       Estado = new Estado() { nome = ddlEstado.SelectedItem.Text, sigla = ddlEstado.SelectedValue },
                       Numero = Convert.ToInt32(txtNumero.Text)
                   },

                   CPF = txtCPF.Text,
                   RG = txtRG.Text,
                   CarteiraTrabalho = txtCarteiraTrabalho.Text,
                   Agencia = txtAgencia.Text,
                   Ativo = ckbAtivo.Checked,
                   Conta_Corrente = txtConta.Text,
                   Banco = txtBanco.Text,
                   Data_Admissao = Convert.ToDateTime(txtAdmissao.Text),
                   Data_Demissao = Convert.ToDateTime("01/01/1900"),
                   PIS = txtPIS.Text,
                   Salario = Convert.ToDouble(txtSalario.Text),
                   Cargo = ddlCargo.SelectedValue,
                   Usuario = txtUsuario.Text,
                   Senha = txtSenha.Text

               };

              

               //chama o serviço que insere o funcionário no banco de dados
               if (servico.CadastrarFuncionario(funcionario))
               {
                   MensagemJS("Funcionário incluído com sucesso!");                   
                   HttpContext.Current.Cache.Remove("Lista_Funcionario");
               
               }
               else
               {
                   MensagemJS("ERRO: Funcionário com esse CPF já existente");
                   return;
               }

           }
           catch(Exception)
           {    
               //se ocorrer exceção lanca mensagem para o usuário
               MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
               return;

           }
           //Limpa todos os campos após o cadastro
           btnLimpar_Click(null, null);

         
        }

        /// <summary>
        /// Limpa todos os campos
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
                txtNome.Text = null;
                txtNascimento.Text = null;
                txtDDDCelular1.Text= null;
                txtDDDCelular2.Text = null;
                txtDDDTelefone1.Text= null;
                txtDDDTelefone2.Text = null;
                txtCelular1.Text= null;
                txtTelefone1.Text= null;
                txtCelular2.Text = null;
                txtEmail.Text = null;
                txtTelefone2.Text = null;
                txtLogradouro.Text= null;
                txtBairro.Text= null;
                txtComplemento.Text = null;
                txtCEP.Text= null;
                txtCidade.Text= null;
                txtNumero.Text= null;
                txtCPF.Text= null;
                txtRG.Text= null;
                txtAgencia.Text = null;
                txtConta.Text = null;
                txtAdmissao.Text= null;
                txtSalario.Text= null;
                txtPIS.Text = null;
                txtCarteiraTrabalho.Text = null;
                txtBanco.Text = null;
                HttpContext.Current.Cache.Remove("Lista_Funcionario");
                HttpContext.Current.Cache.Remove("Lista_Permissao");
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            //Redireciona para a pagina anterior
            Response.Redirect("~/Apresentacao/Funcionarios/ListarFuncionarios.aspx");
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "Mensagem",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
       
       

       
    }
       
}
